home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / X.nasl < prev    next >
Text File  |  2005-03-31  |  6KB  |  189 lines

  1. # Fri May 12 15:58:21 GMT 2000
  2. # John Jackson <jjackson@attrition.org>
  3. #
  4. # Test for an "open" X server
  5.  
  6. # An X server's access control is disabled (e.g. through an "xhost +" command) and 
  7. # allows anyone to connect to the server. 
  8.  
  9. # proper X11 protocol handling
  10. # by Pavel Kankovsky <kan@dcit.cz>
  11.  
  12. #
  13. # Changes by rd :
  14. #
  15. # - description
  16. # - minor style issues
  17. # - script_require_ports()
  18. #
  19.  
  20. if(description)
  21. {
  22.   script_id(10407);
  23.   script_version ("$Revision: 1.21 $");
  24. # script_cve_id("CVE-1999-0526");
  25.  
  26.   name["english"] = "X Server";
  27.   script_name(english:name["english"]);
  28.  
  29.   desc["english"] = "
  30. This plugin detects X Window servers.
  31.  
  32. X11 is a client - server protocol. Basically, the server is in charge of the 
  33. screen, and the clients connect to it and send several requests like drawing 
  34. a window or a menu, and the server sends events back to the clients, such as 
  35. mouse clicks, key strokes, and so on...
  36.  
  37. An improperly configured X server will accept connections from clients from 
  38. anywhere. This allows an attacker to make a client connect to the X server to 
  39. record the keystrokes of the user, which may contain sensitive information,
  40. such as account passwords.
  41. This can be prevented by using xauth, MIT cookies, or preventing
  42. the X server from listening on TCP (a Unix sock is used for local 
  43. connections)
  44. ";
  45.  
  46.  script_description(english:desc["english"]);
  47.  
  48.  summary["english"] = "An X Window System Server is present";
  49.  script_summary(english:summary["english"]);
  50.  
  51.  script_category(ACT_GATHER_INFO);
  52.  family["english"] = "Misc.";
  53.  family["francais"] = "Divers";
  54.  script_family(english:family["english"], francais:family["francais"]);
  55.  script_dependencie("find_service.nes");
  56.  script_require_ports(6000, 6001, 6002, 6003, 6004, 6005, 6006, 6007, 6008, 6009);
  57.  
  58.  script_copyright(english:"This script is Copyright (C) 2000 John Jackson");
  59.  exit(0);
  60. }
  61.  
  62. #
  63. # The script code starts here
  64. #
  65. function riptext(data, begin, length)
  66. {
  67.   count=begin;
  68.   end=begin+length-1;
  69.   if (end >= strlen(data))
  70.     end = strlen(data) - 1;
  71.   text="";
  72.   for(count=begin;count<=end;count=count+1)
  73.   {
  74.     text = string(text + data[count]);
  75.   }
  76.   return(text);
  77. }
  78.  
  79. include("misc_func.inc");
  80.  
  81. ####   ##   # ###
  82. # # # #  #  # #  #
  83. # # #  ## # # #  #
  84.  
  85. #
  86. # The format of client request
  87. #  CARD8    byteOrder (66 'B'=MSB, 108 'l'=LSB)
  88. #  BYTE     padding
  89. #  CARD16   majorVersion, minorVersion
  90. #  CARD16   nBytesAuthProto  (authorization protocol)
  91. #  CARD16   nBytesAuthString (authorization data)
  92. #  CARD     padding
  93. #  STRING8  authProto
  94. #  STRING8  authString
  95. #
  96. # The format of server response:
  97. #  CARD8    success (0=Failed, 1=Success, 2=Authenticate)
  98. #  BYTE     lengthReason (unused if success==1)
  99. #  CARD16   majorVersion, minorVersion (unused if success==2)
  100. #  CARD16   length (of additional data)
  101. #  STRING8  reason (for success==0 or success==1)
  102. #
  103. # CARD16 values are endian-sensitive; endianness is determined by
  104. # the first byte sent by a client
  105. #
  106.  
  107. # hmm....it might look like a good idea to raise the higher limit to test
  108. # connections forwarded by OpenSSH but it is pointless because OpenSSH
  109. # does not process connections without a cookie--everything you'll get
  110. # will be a stale connection
  111.  
  112. for(port=6000; port<6010; port++)
  113. {
  114.   if(get_port_state(port))
  115.   { 
  116.     tcpsock = open_sock_tcp(port);
  117.     if(tcpsock)
  118.     {
  119.     xwininfo = raw_string(108,0,11,0,0,0,0,0,0,0,0,0);
  120.     # change the xwininfo bytes above to force servers to send a version mismatch
  121.  
  122.     send(socket:tcpsock, data:xwininfo);
  123.     tcpresult = recv(socket:tcpsock, length:32);
  124.     close(tcpsock);
  125.  
  126.     if(tcpresult && strlen(tcpresult) >= 8)
  127.     {
  128.       result = ord(tcpresult[0]);
  129.  
  130.       if (result == 0) # Failed
  131.           {
  132.             major = ord(tcpresult[2]) + 256 * ord(tcpresult[3]);
  133.             minor = ord(tcpresult[4]) + 256 * ord(tcpresult[5]);
  134.             ver = strcat(major, ".", minor);
  135.             set_kb_item(name: "X11/"+port+"/version", value: ver);
  136.             textresult=riptext(data:tcpresult, begin:8, length:ord(tcpresult[1]));
  137.             set_kb_item(name: "X11/"+port+"/answer", value: textresult);
  138.             set_kb_item(name: "X11/"+port+"/open", value: FALSE);
  139.  
  140.         report = string("This X server does *not* allow any client to connect to it\n",
  141.             "however it is recommended that you filter incoming connections\n",
  142.         "to this port as attacker may send garbage data and slow down\n",
  143.         "your X session or even kill the server.\n\n",
  144.         "Here is the server version : ", ver, "\n",
  145.         "Here is the message we received : ", textresult, "\n\n",
  146.         "Solution : filter incoming connections to ports 6000-6009\n",
  147.         "Risk factor : Low");
  148.             security_note(port:port, data:report);
  149.         register_service(port: port, proto: "X11");
  150.           }
  151.  
  152.       if (result == 1) # Success
  153.           {
  154.             major = ord(tcpresult[2]) + 256 * ord(tcpresult[3]);
  155.             minor = ord(tcpresult[4]) + 256 * ord(tcpresult[5]);
  156.             ver = strcat(major, ".", minor);
  157.             set_kb_item(name: "X11/"+port+"/version", value: ver);
  158.             textresult=riptext(data:tcpresult, begin:40, length:ord(tcpresult[24]));
  159.             set_kb_item(name: "X11/"+port+"/answer", value: textresult);
  160.             set_kb_item(name: "X11/"+port+"/open", value: TRUE);
  161.  
  162.      # security_hole moved to open_X11_server.nasl
  163.         register_service(port: port, proto: "X11");
  164.           }
  165.  
  166.       if (result == 2) # Authenticate
  167.           {
  168.             textresult=riptext(data:tcpresult, begin:8, length:ord(tcpresult[1]));
  169.             set_kb_item(name: "X11/"+port+"/answer", value: textresult);
  170.             set_kb_item(name: "X11/"+port+"/open", value: FALSE);
  171.  
  172.         report = string("This X server does *not* allow any client to connect to it\n",
  173.             "however it is recommended that you filter incoming connections\n",
  174.         "to this port as attacker may send garbage data and slow down\n",
  175.         "your X session or even kill the server.\n\n",
  176.         "Here is the message we received : ", textresult, "\n\n",
  177.         "Solution : filter incoming connections to ports 6000-6009\n",
  178.         "Risk factor : Low");
  179.             security_note(port:port, data:report);
  180.         register_service(port: port, proto: "X11");
  181.           }
  182.  
  183.     } #if tcpresult
  184.    } #if tcpsock
  185.   } #if port open
  186. } #for portnum
  187.  
  188. exit(0);
  189.